<?php

namespace Libraries\OAuth2Client;
use Models\User;

abstract class OAuth2Client
{

    /**
     * @var string 客户端id
     */
    protected $clientId;

    /**
     * @var string 客户端令牌
     */
    protected $clientSecret;

    /**
     * @var string 重定向地址
     */
    protected $redirectUri;

    /**
     * @var string 授权码字段名称
     */
    protected $codeName = 'code';

    /**
     * 构造器
     */
    public function __construct(array $options = array())
    {
        foreach ($options as $option => $value) {
            if (property_exists($this, $option)) {
                $this->{$option} = $value;
            }
        }
    }

    /**
     * 跳转至用户授权页
     *
     * @param string 权限范围
     * @return void
     */
    abstract public function redirectToAuthorize($scopes);

    /**
     * 获取access_token
     *
     * @return array access_token
     * — access_token: 访问令牌
     * — user_id: 用户id
     * - expires_in: 令牌有效时间
     * - refresh_token: 刷新令牌有
     * - refresh_token_expires_in: 刷新令牌有效时间
     */
    abstract public function getAccessToken($param);

    /**
     * 刷新令牌
     *
     * @return array access_token
     * — access_token: 访问令牌
     * — user_id: 用户id
     * - expires_in: 令牌有效时间
     * - refresh_token: 刷新令牌有
     * - refresh_token_expires_in: 刷新令牌有效时间
     */
    abstract public function refreshToken($refreshToken);

    /**
     * 获取用户信息
     *
     * @return array
     */
    abstract public function getUserInfo($access_token);

    /**
     * 保存用户
     *
     * @param Models\User user storage
     * @param array userInfo
     * @return Models\User
     */
    public function saveUser(User $user, $userInfo)
    {

    }

    public function getCode()
    {
        return $_GET[$this->codeName];
    }
}